#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
MongoDB到MySQL数据迁移脚本
将现有MongoDB数据迁移到MySQL数据库
"""

import sys
from datetime import datetime
from typing import Dict, List, Any
from database.mysql_manager import mysql_manager
from models import User, Project, Interface, TestCase
from config import current_config

# 如果有MongoDB，取消注释以下导入
# from pymongo import MongoClient


class DataMigrator:
    """数据迁移器"""
    
    def __init__(self):
        self.mysql_session = None
        self.mongo_client = None
        self.mongo_db = None
        
    def connect_mongodb(self) -> bool:
        """连接MongoDB（如果存在）"""
        try:
            # 这里可以添加MongoDB连接代码
            # self.mongo_client = MongoClient('mongodb://localhost:27017/')
            # self.mongo_db = self.mongo_client['aitest_platform']
            # self.mongo_client.server_info()
            print("⚠️ MongoDB连接已禁用，将使用示例数据")
            return False
        except Exception as e:
            print(f"❌ MongoDB连接失败: {e}")
            return False
    
    def connect_mysql(self) -> bool:
        """连接MySQL"""
        try:
            self.mysql_session = mysql_manager.get_session()
            if not self.mysql_session:
                return False
            
            print("✅ MySQL连接成功")
            return True
        except Exception as e:
            print(f"❌ MySQL连接失败: {e}")
            return False
    
    def migrate_users(self) -> bool:
        """迁移用户数据"""
        try:
            print("正在迁移用户数据...")
            
            # 示例迁移数据（如果有MongoDB数据，可以从MongoDB读取）
            users_data = self._get_sample_users()
            
            for user_data in users_data:
                # 检查用户是否已存在
                existing_user = self.mysql_session.query(User).filter(
                    User.username == user_data['username']
                ).first()
                
                if existing_user:
                    print(f"  跳过已存在的用户: {user_data['username']}")
                    continue
                
                # 创建新用户
                user = User(**user_data)
                self.mysql_session.add(user)
                print(f"  ✅ 迁移用户: {user_data['username']}")
            
            self.mysql_session.commit()
            print(f"✅ 用户数据迁移完成，共处理 {len(users_data)} 条记录")
            return True
            
        except Exception as e:
            print(f"❌ 用户数据迁移失败: {e}")
            self.mysql_session.rollback()
            return False
    
    def migrate_projects(self) -> bool:
        """迁移项目数据"""
        try:
            print("正在迁移项目数据...")
            
            projects_data = self._get_sample_projects()
            
            for project_data in projects_data:
                # 检查项目是否已存在
                existing_project = self.mysql_session.query(Project).filter(
                    Project.name == project_data['name']
                ).first()
                
                if existing_project:
                    print(f"  跳过已存在的项目: {project_data['name']}")
                    continue
                
                # 创建新项目
                project = Project(**project_data)
                self.mysql_session.add(project)
                print(f"  ✅ 迁移项目: {project_data['name']}")
            
            self.mysql_session.commit()
            print(f"✅ 项目数据迁移完成，共处理 {len(projects_data)} 条记录")
            return True
            
        except Exception as e:
            print(f"❌ 项目数据迁移失败: {e}")
            self.mysql_session.rollback()
            return False
    
    def migrate_interfaces(self) -> bool:
        """迁移接口数据"""
        try:
            print("正在迁移接口数据...")
            
            # 获取项目映射
            projects = self.mysql_session.query(Project).all()
            project_map = {p.name: p.id for p in projects}
            
            interfaces_data = self._get_sample_interfaces(project_map)
            
            for interface_data in interfaces_data:
                if not interface_data.get('project_id'):
                    print(f"  跳过无效的接口: {interface_data.get('name', 'Unknown')}")
                    continue
                
                # 检查接口是否已存在
                existing_interface = self.mysql_session.query(Interface).filter(
                    Interface.name == interface_data['name'],
                    Interface.project_id == interface_data['project_id']
                ).first()
                
                if existing_interface:
                    print(f"  跳过已存在的接口: {interface_data['name']}")
                    continue
                
                # 创建新接口
                interface = Interface(**interface_data)
                self.mysql_session.add(interface)
                print(f"  ✅ 迁移接口: {interface_data['name']}")
            
            self.mysql_session.commit()
            print(f"✅ 接口数据迁移完成，共处理 {len(interfaces_data)} 条记录")
            return True
            
        except Exception as e:
            print(f"❌ 接口数据迁移失败: {e}")
            self.mysql_session.rollback()
            return False
    
    def migrate_test_cases(self) -> bool:
        """迁移测试案例数据"""
        try:
            print("正在迁移测试案例数据...")
            
            # 获取接口映射
            interfaces = self.mysql_session.query(Interface).all()
            interface_map = {i.name: i.id for i in interfaces}
            
            test_cases_data = self._get_sample_test_cases(interface_map)
            
            for test_case_data in test_cases_data:
                if not test_case_data.get('interface_id'):
                    print(f"  跳过无效的测试案例: {test_case_data.get('name', 'Unknown')}")
                    continue
                
                # 检查测试案例是否已存在
                existing_case = self.mysql_session.query(TestCase).filter(
                    TestCase.name == test_case_data['name'],
                    TestCase.interface_id == test_case_data['interface_id']
                ).first()
                
                if existing_case:
                    print(f"  跳过已存在的测试案例: {test_case_data['name']}")
                    continue
                
                # 创建新测试案例
                test_case = TestCase(**test_case_data)
                self.mysql_session.add(test_case)
                print(f"  ✅ 迁移测试案例: {test_case_data['name']}")
            
            self.mysql_session.commit()
            print(f"✅ 测试案例数据迁移完成，共处理 {len(test_cases_data)} 条记录")
            return True
            
        except Exception as e:
            print(f"❌ 测试案例数据迁移失败: {e}")
            self.mysql_session.rollback()
            return False
    
    def _get_sample_users(self) -> List[Dict[str, Any]]:
        """获取示例用户数据"""
        return [
            {
                'username': 'admin',
                'password': 'admin123',
                'email': 'admin@aitest.com',
                'role': 'administrator',
                'permissions': ['read', 'write', 'admin'],
                'is_active': True
            },
            {
                'username': 'idahan',
                'password': 'Hb@123456',
                'email': 'idahan@aitest.com',
                'role': 'administrator',
                'permissions': ['read', 'write', 'admin'],
                'is_active': True
            }
        ]
    
    def _get_sample_projects(self) -> List[Dict[str, Any]]:
        """获取示例项目数据"""
        return [
            {
                'name': 'AI测试平台',
                'description': '基于人工智能的自动化测试平台',
                'created_by': 'admin',
                'status': 'active',
                'tags': ['AI', 'testing', 'automation'],
                'settings': {
                    'auto_test': True,
                    'notification': True,
                    'api_version': 'v1'
                }
            }
        ]
    
    def _get_sample_interfaces(self, project_map: Dict[str, int]) -> List[Dict[str, Any]]:
        """获取示例接口数据"""
        ai_platform_id = project_map.get('AI测试平台')
        if not ai_platform_id:
            return []
        
        return [
            {
                'project_id': ai_platform_id,
                'name': '用户登录',
                'url': '/api/auth/login',
                'method': 'POST',
                'description': '用户认证登录接口',
                'status': 'active',
                'headers': {'Content-Type': 'application/json'},
                'request_body': {
                    'username': 'string',
                    'password': 'string'
                },
                'response_schema': {
                    'success': 'boolean',
                    'data': 'object'
                }
            }
        ]
    
    def _get_sample_test_cases(self, interface_map: Dict[str, int]) -> List[Dict[str, Any]]:
        """获取示例测试案例数据"""
        login_interface_id = interface_map.get('用户登录')
        if not login_interface_id:
            return []
        
        return [
            {
                'interface_id': login_interface_id,
                'name': '管理员登录测试',
                'description': '使用管理员账户进行登录测试',
                'type': 'functional',
                'status': 'active',
                'priority': 'high',
                'test_data': {
                    'username': 'admin',
                    'password': 'admin123'
                },
                'expected_result': {
                    'success': True,
                    'status_code': 200
                }
            }
        ]
    
    def run_migration(self) -> bool:
        """执行完整的数据迁移"""
        print("=" * 60)
        print("MongoDB到MySQL数据迁移工具")
        print("=" * 60)
        
        # 连接数据库
        if not self.connect_mysql():
            print("❌ MySQL连接失败，迁移终止")
            return False
        
        self.connect_mongodb()  # MongoDB连接失败不影响迁移
        
        try:
            # 创建数据表
            mysql_manager._create_tables()
            print("✅ 数据表检查完成")
            
            # 按顺序迁移数据
            success = True
            success &= self.migrate_users()
            success &= self.migrate_projects()
            success &= self.migrate_interfaces()
            success &= self.migrate_test_cases()
            
            if success:
                print("\n✅ 所有数据迁移完成！")
                return True
            else:
                print("\n❌ 部分数据迁移失败！")
                return False
                
        except Exception as e:
            print(f"❌ 迁移过程中发生错误: {e}")
            return False
        finally:
            if self.mysql_session:
                self.mysql_session.close()
            if self.mongo_client:
                self.mongo_client.close()


def main():
    """主函数"""
    # 检查MySQL连接
    health_status = mysql_manager.health_check()
    if health_status['status'] != 'healthy':
        print("❌ MySQL数据库连接失败，请检查配置")
        print(f"错误信息: {health_status['message']}")
        sys.exit(1)
    
    # 询问用户确认
    print("此工具将把数据迁移到MySQL数据库")
    print(f"目标数据库: {current_config.MYSQL_HOST}:{current_config.MYSQL_PORT}/{current_config.MYSQL_DB}")
    confirm = input("是否确认开始迁移？(y/N): ")
    if confirm.lower() != 'y':
        print("❌ 操作已取消")
        sys.exit(0)
    
    # 执行迁移
    migrator = DataMigrator()
    if migrator.run_migration():
        print("\n🎉 数据迁移成功完成！")
        print("\n📋 可用的登录账户:")
        print("  管理员: admin / admin123")
        print("  管理员: idahan / Hb@123456")
    else:
        print("\n❌ 数据迁移失败！")
        sys.exit(1)


if __name__ == '__main__':
    main()